#include <stdio.h>          // 标准输入输出
#include <stdlib.h>         // 用于 atoi() 函数
#include <string.h>         // 字符串操作
#include <unistd.h>         // 提供 close() 等系统调用
#include <arpa/inet.h>      // 网络地址转换 (inet_addr, htons)
#include <sys/socket.h>     // 套接字编程 (socket, bind, listen, accept)
#include <netinet/in.h>     // Internet 地址族 (sockaddr_in)
#include <errno.h>          // 错误处理 (errno)
#include<my_header.h>
#include <sys/select.h>     // I/O多路复用 (select, FD_*, fd_set)
#include<mysql/mysql.h>

#include <openssl/evp.h>
#include <openssl/sha.h>
typedef struct TLV {
	uint8_t type;//类型
	uint32_t length;//长度
	uint32_t seq;//id
    char username[9];        //用户名
    char token[65];         //token
	char value[1024];//缓冲区

}TLV;
#define TLV_HEADER_SIZE 13
typedef enum {
    // 基本命令
    CMD_CD = 0x01,          // 改变目录
    CMD_LS = 0x02,          // 列出目录
    CMD_PWD = 0x03,         // 当前工作目录

    // 文件操作命令
    CMD_PUTS = 0x10,        // 上传文件
    CMD_GETS = 0x11,        // 下载文件
    CMD_REMOVE = 0x12,      // 删除文件
    CMD_MKDIR = 0x13,       // 创建目录
    CMD_RMDIR = 0x14,       // 删除目录

    // 大文件传输命令
    CMD_FILE_START = 0x20,  // 文件传输开始
    CMD_FILE_DATA = 0x21,   // 文件数据块
    CMD_FILE_END = 0x22,    // 文件传输结束

    // 响应和错误
    CMD_RESPONSE = 0x30,    // 正常响应
    CMD_ERROR = 0xFF, // 错误响应

      CMD_REGISTER =0x41 ,//注册
        CMD_SIGNIN=0x42   //登录
} CommandType;
int create_encrypt(unsigned char*salt,char*password,unsigned char*digest);//加密文
int create_salt(unsigned  char*salt);
int send_all(int sockfd,const void *buf,size_t len);
  int sendTlv(int sockfd,TLV *tlv);
  int recv_all(int sockfd,void *buf,size_t len);
 int recvTlv(int sockfd,TLV* tlv);
int tackle_register(int socket, MYSQL *db,TLV*TLV_RECV);//处理注册，失败返回-1.成功返回id>
int get_user_id(MYSQL *db, const char *username);
int tackle_signin(int socket, MYSQL *db,TLV*TLV_RECV);//处理登录，失败返回-1，成功返回用户id
int quit_user(int id,MYSQL*db);//推出时使用，将表中的”已登录“标记清零
int delete_user(int id,MYSQL*db);//删除函数，将”已删除“标记添加，逻辑删除                             //
